// fileStorage.js
const fs = wx.getFileSystemManager();
const BASE_DIR = `${wx.env.USER_DATA_PATH}/sida/`;

// 确保存储目录存在
function ensureDirExists() {
	try {
		fs.accessSync(BASE_DIR);
	} catch (e) {
		fs.mkdirSync(BASE_DIR, true);
	}
}

// 获取安全的文件名
function getSafeFileName(key) {
	return key.replace(/[\/\\:*?"<>|]/g, '_') + '.json';
}

// 获取文件完整路径
function getFilePath(key) {
	return BASE_DIR + getSafeFileName(key);
}

/**
 * 设置文件存储（兼容 uni.setStorage 风格）
 * @param {Object} options
 *   @property {string} key - 存储键名
 *   @property {any} data - 存储数据
 *   @property {function} [success] - 成功回调
 *   @property {function} [fail] - 失败回调
 *   @property {function} [complete] - 完成回调
 */
export function setFile(options) {
	const { key, data, success, fail, complete } = options || {};
  
	if (!key) {
		fail && fail({ errMsg: 'setFile:fail key is required' });
		complete && complete();
		return;
	}
  
	try {
		ensureDirExists();
		const filePath = getFilePath(key);
    
		// 写入文件（自动覆盖同名文件）
		fs.writeFileSync(filePath, JSON.stringify(data), 'utf8');
    
		success && success({ data: data});
	} catch (e) {
		console.error('文件存储失败', e);
		fail && fail({ errMsg: `setFile:fail ${e.message || e.errMsg}` });
	} finally {
		complete && complete();
	}
}

/**
 * 获取文件存储（兼容 uni.getStorage 风格）
 * @param {Object} options
 *   @property {string} key - 存储键名
 *   @property {function} [success] - 成功回调，参数为 {data}
 *   @property {function} [fail] - 失败回调
 *   @property {function} [complete] - 完成回调
 */
export function getFile(options) {
	const { key, success, fail, complete } = options || {};
  
	if (!key) {
		fail && fail({ errMsg: 'getFile:fail key is required' });
		complete && complete();
		return;
	}
  
	try {
		const filePath = getFilePath(key);
    
		// 检查文件是否存在
		fs.accessSync(filePath);
    
		// 读取文件内容
		const content = fs.readFileSync(filePath, 'utf8');
    
		// 成功回调返回 {data} 对象
		success && success({ data: JSON.parse(content) });
	} catch (e) { 
		success && success({ data: {} });
	} finally {
		complete && complete();
	}
}

/**
 * 移除文件存储（兼容 uni.removeStorage 风格）
 * @param {Object} options
 *   @property {string} key - 存储键名
 *   @property {function} [success] - 成功回调
 *   @property {function} [fail] - 失败回调
 *   @property {function} [complete] - 完成回调
 */
export function removeFile(options) {
	const { key, success, fail, complete } = options || {};
  
	if (!key) {
		fail && fail({ errMsg: 'removeFile:fail key is required' });
		complete && complete();
		return;
	}
  
	try {
		const filePath = getFilePath(key);
    
		// 检查文件是否存在
		fs.accessSync(filePath);
    
		// 删除文件
		fs.unlinkSync(filePath);
    
		success && success();
	} catch (e) {
		success && success();
	} finally {
		complete && complete();
	}
}

/**
 * 清除所有文件存储（兼容 uni.clearStorage 风格）
 * @param {Object} [options]
 *   @property {function} [success] - 成功回调
 *   @property {function} [fail] - 失败回调
 *   @property {function} [complete] - 完成回调
 */
export function clearFiles(options) {
	const { success, fail, complete } = options || {};
  
	try {
		ensureDirExists();
    
		// 读取目录下所有文件
		const files = fs.readdirSync(BASE_DIR);
    
		// 删除所有文件
		files.forEach(file => {
			try {
				fs.unlinkSync(`${BASE_DIR}${file}`);
			} catch (e) {
				console.warn(`删除文件 ${file} 失败`, e);
			}
		});
    
		success && success();
	} catch (e) {
		console.error('清除存储失败', e);
		fail && fail({ errMsg: `clearFiles:fail ${e.message || e.errMsg}` });
	} finally {
		complete && complete();
	}
}